package pers.jl.controller;


import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;
import pers.jl.common.R;

import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.util.UUID;

@RestController
@RequestMapping("/common")
@Slf4j
public class CommonController {

    // 读取配置文件自定义配置，文件夹路径
    @Value("${reggie.path}")
    private String basePath;

    /**
     * 文件上传(图片)
     * @param file
     * @return
     */
    @PostMapping("upload")
    public R<String> upload(MultipartFile file){

        // 1.重新给文件命名
        // 获取原来文件名
        String originalFilename = file.getOriginalFilename();
        // 截取文件后缀
        String subfix = originalFilename.substring(originalFilename.lastIndexOf("."));
        // 随机生成UUid,拼接成新文件名
        String newname = UUID.randomUUID().toString() + subfix;


        // 2.判断转存文件夹是否存在
        File file1 = new File(basePath);
        if (!file1.exists()) {
            // 文件夹不存在，新建文件夹
            file1.mkdirs();
            log.info("文件创建成功。");
        }

        // 3.文件转存
        try {
            // 如果是在服务器上，我们可以把图片保存到一个linux文件夹下面
            file.transferTo(new File(basePath + newname));
            log.info("文件转存成功。");
        } catch (IOException e) {
            e.printStackTrace();
        }
        // 转存成功，返回文件名字，
        // 因为待会图片展示需要下载，就是需要上传成功时返回文件名，它才知道要下载哪个图片
        return R.success(newname);
    }


    /**
     * 文件下载(图片)
     * @param response
     * @param name
     * @return
     */
    @GetMapping("/download")
    public void download(HttpServletResponse response,String name){// 页面发来的请求就带有文件名，是在上传文件时返回给页面的。
        log.info("开始下载图片"+name);
        try {
            // 1.从哪里获取文件
            FileInputStream inputStream = new FileInputStream(new File(basePath+name));
            // 2.下载文件到哪里
            ServletOutputStream outputStream = response.getOutputStream();
            // 3. 设置响应文件格式
            response.setContentType("image/jpeg");

            // 4. 读取文件，写到输出流中
            int len = 0;
            byte[] bytes = new byte[1024];
            // .read(bytes)的意思就是一次性读取1024个数据，
            // 返回值是一个int，就是返回的是读取的指针的下标，
            // 当指针为-1时，就代表读取完成
            // 边读边写
            while ((len = inputStream.read(bytes)) != -1){
                // 一次性写出1024个数据，从数组下标为0位置开始写入，写入的字节数为读取的文件字节长度。
                outputStream.write(bytes,0,len);
                // 用于清空输出流
                outputStream.flush();
            }
            log.info("图片下载完毕"+name);
            // 5. 关闭资源
            inputStream.close();
            outputStream.close();
        } catch (Exception e) {
            System.out.println(e.getMessage());
        }
    }

}
